/*
*    Qizx/open 3.0 beta
*
* This code is the open-source version of Qizx.
* Copyright (C) 2004-2009 Axyana Software -- All rights reserved.
*
* The contents of this file are subject to the Mozilla Public License 
*  Version 1.1 (the "License"); you may not use this file except in 
*  compliance with the License. You may obtain a copy of the License at
*  http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
*  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
*  for the specific language governing rights and limitations under the
*  License.
*
* The Initial Developer of the Original Code is Xavier Franc - Axyana Software.
*
*/
using System;
using Utils = System.Qizx.Util.Basic.Utils;
namespace System.Qizx.Util
{
	
	/// <summary> SQL-LIKE pattern matching. Similar to Glob pattern but slightly different
	/// syntax.
	/// </summary>
	public class SqlLikePattern:LikePattern
	{
		public SqlLikePattern(string pattern):this(pattern.ToCharArray(), pattern.Length)
		{
		}
		
		public SqlLikePattern(char[] pattern, int length):base(null, 0)
		{
			System.Text.StringBuilder buf = new System.Text.StringBuilder(length);
			int fix = - 1;
			for (int p = 0; p < length; ++p)
				switch (pattern[p])
				{
					
					case '%': 
						if (fix < 0)
						{
							fix = p;
							_fixedPrefixStart = buf.Length;
						}
						buf.Append('*');
						break;
					
					case '_': 
						if (fix < 0)
						{
							fix = p;
							_fixedPrefixStart = buf.Length;
						}
						buf.Append('?');
						break;
					
					case '*': 
						buf.Append("\\*");
						break;
					
					case '?': 
						buf.Append("\\?");
						break;
					
					default: 
						buf.Append(pattern[p]);
						break;
					
				}
			
			this._pattern = new char[buf.Length];
			int i;
			int j;
			i = 0;
			j = 0;
			while (i < this._pattern.Length)
			{
				this._pattern[j] = buf[i];
				i++;
				j++;
			}
			
			_fixedPrefix = Utils.subArray(pattern, 0, fix < 0?pattern.Length:fix);
		}
	}
}